import axios from 'axios';
import type { AxiosError, InternalAxiosRequestConfig, AxiosResponse } from 'axios';
import { message } from 'antd';
import type { ApiResponse } from '@/types';
import { useAuthStore } from '@/stores/useAuthStore';

// 创建axios实例
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:4321/api',
  timeout: 30000,
  headers: {
    'Content-Type': 'application/json',
  },
});

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 添加token
    const token = localStorage.getItem('access_token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    // 请求配置错误
    message.error('请求配置错误，请稍后重试');
    console.error('Request Config Error:', error);
    return Promise.reject(error);
  },
);

// 用于防止重复跳转
let isRedirecting = false;

// 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse<ApiResponse>) => {
    const { data } = response;
    
    // 如果响应success为false，显示错误消息
    if (data && data.success === false && data.message) {
      message.error(data.message);
    }
    
    // 注意：成功消息由各个页面自己控制显示
    // 这里不统一显示，避免每个请求都弹出提示
    
    return response;
  },
  (error: AxiosError<ApiResponse>) => {
    // 处理错误响应
    if (error.response) {
      const { status, data } = error.response;
      
      // 提取错误消息
      const errorMessage = data?.message || (data as any)?.error || '';
      
      switch (status) {
        case 400:
          // 请求参数错误 - 显示详细的验证错误
          if (data?.errors && Array.isArray(data.errors) && data.errors.length > 0) {
            // 显示第一个验证错误
            const firstError = data.errors[0];
            message.error(`${firstError.field}: ${firstError.message}`);
          } else {
            message.error(errorMessage || '请求参数错误，请检查输入');
          }
          break;
          
        case 401:
          // 未认证，清除token并跳转到登录页
          if (!isRedirecting) {
            isRedirecting = true;
            
            // 清除 localStorage 中的 token
            localStorage.removeItem('access_token');
            localStorage.removeItem('refresh_token');
            
            // 清除 store 中的认证状态
            useAuthStore.getState().clearAuth();
            
            message.error(errorMessage || '登录已过期，请重新登录');
            
            // 延迟跳转，让用户看到提示信息
            setTimeout(() => {
              window.location.href = '/login';
              // 重置跳转标志，以便下次可以再次跳转
              isRedirecting = false;
            }, 500);
          }
          break;
          
        case 403:
          // 权限不足
          message.error(errorMessage || '没有权限访问此资源');
          break;
          
        case 404:
          // 资源不存在
          // 对于某些可选资源的 404 错误，不显示错误消息（如模板配置）
          const url = error.config?.url || '';
          const isOptionalResource = url.includes('/import-template') || url.includes('/export-template');
          if (!isOptionalResource) {
            message.error(errorMessage || '请求的资源不存在');
          }
          break;
          
        case 422:
          // 数据验证失败
          message.error(errorMessage || '数据验证失败，请检查输入');
          break;
          
        case 500:
          // 服务器错误
          message.error(errorMessage || '服务器错误，请稍后重试');
          break;
          
        case 502:
          // 网关错误
          message.error('网关错误，请稍后重试');
          break;
          
        case 503:
          // 服务不可用
          message.error('服务暂时不可用，请稍后重试');
          break;
          
        case 504:
          // 网关超时
          message.error('请求超时，请稍后重试');
          break;
          
        default:
          // 其他HTTP错误
          message.error(errorMessage || `请求失败 (${status})`);
      }
    } else if (error.request) {
      // 请求已发送但没有收到响应（网络问题）
      message.error('网络连接失败，请检查您的网络');
      console.error('Network Error:', error.request);
    } else if (error.code === 'ECONNABORTED') {
      // 请求超时
      message.error('请求超时，请稍后重试');
    } else {
      // 其他错误（如配置错误）
      message.error(error.message || '请求失败，请稍后重试');
      console.error('Request Error:', error);
    }
    
    return Promise.reject(error);
  },
);

// 导出请求方法
export const get = <T = any>(url: string, params?: any, config?: InternalAxiosRequestConfig) => {
  return request.get<ApiResponse<T>>(url, { ...config, params } as any);
};

export const post = <T = any>(url: string, data?: any, config?: InternalAxiosRequestConfig) => {
  return request.post<ApiResponse<T>>(url, data, config as any);
};

export const put = <T = any>(url: string, data?: any, config?: InternalAxiosRequestConfig) => {
  return request.put<ApiResponse<T>>(url, data, config as any);
};

export const del = <T = any>(url: string, config?: InternalAxiosRequestConfig) => {
  return request.delete<ApiResponse<T>>(url, config as any);
};

export default request;

